const path=require("path");
const Koa=require("koa");
const logger=require("koa-logger");
const onerror=require("koa-onerror");
const serve=require("koa-static");
const koaBody=require("koa-body");
const router=require("./router");
const { historyApiFallback } = require('koa2-connect-history-api-fallback');

const app=new Koa();
app.use(logger());
onerror(app);

// vue-router历史模式兼容服务插件必须定义在所有服务器静态资源之前
//      服务器的请求资源不是只有vue项目一个，还包含其它静态资源和数据接口等
//      历史模式的兼容插件必须准确设置 vue 项目的入口html文件，和被操作的项目目录
//      并通过白名单方式完成其它非vue项目的路径放行
app.use( historyApiFallback({
    // index 用于配置 vue 项目的入口html文件
    // index的路径是以服务器路径为参考的 => http://127.0.0.1:3002/wbs22082/index.html
    index:"/wbs22082/index.html",
    // 访问路径判断重写，定义放行白名单
    rewrites:[
        {
            // 路径判断依据
            // 通过正则拦截符合条件的请求，经过to配置进行地址转换
            from:new RegExp("^(?!(/wbs22082/)).*"), 
            // 重写返回路径
            to:function(content){
                // 将访问路径直接向下进行服务器执行
                return content.parsedUrl.path
            }
        }
    ]
}) );


app.use(koaBody({
    multipart:true,
    formidable:{
        uploadDir:path.join(__dirname,'./public/upload'),
        keepExtensions:true
    }
}));
let staticPath=path.join(__dirname,'./public');
app.use(serve(staticPath));
app.use(async function(ctx,next){
    // console.log( ctx.path )
    //  以 /api 开头的请求都不能跨域
    if( ctx.path.startsWith("/api") ){
        await next();
    }else{
        ctx.set("Access-Control-Allow-Origin","*");//允许指定域名的跨源请求
        ctx.set("Access-Control-Allow-Methods","GET,POST,OPTIONS,PUT,DELETE,PATCH");
        ctx.set("Access-Control-Allow-Headers","Content-Type,test,Authorization");
        if(ctx.method=="OPTIONS"){
            ctx.body = "";
        }else{
            await next();
        }
    }
})
app.use(router.public.routes());
app.use(router.api.routes());

app.listen(3000);